package com.a01_2021.thousandstimes.utils;

import com.a01_2021.thousandstimes.exception.CustomException;
import com.a01_2021.thousandstimes.exception.CustomExceptionType;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

/**
 * @Author E1xP@foxmail.com
 * @Version 1.0
 * @PACKAGE_NAME com.a01_2021.thousandstimes.utils
 * @CLASS_NAME IO
 * @Description TODO 用于处理文件存储
 * @Date 2021/3/17 下午 4:17
 **/

@Service
public class IO {

    static private String basePath;//数据文件夹路径

    /**
     * 将传入文件重命名uuid后存入名为 folderName的文件夹，返还新文件名
     *
     * @param inputFile  传入文件
     * @param ext        文件后缀名
     * @param folderName 存入文件夹名
     * @return 返还存入文件名
     * @throws IOException 若存储失败抛出该异常
     */
    public static String saveFile(MultipartFile inputFile, String ext, String folderName) throws IOException {

        //整理文件名
        folderName = folderName.trim();
        if (folderName.startsWith("/")) {
            //删除多余的/
            folderName = folderName.substring(1);
        }
        String filePath = (basePath.endsWith("/") ? basePath : basePath + "/") + (folderName.endsWith("/") ? folderName : folderName + "/");
        String uuid = UUID.randomUUID().toString();
        String fileComName = uuid + ext;//新文件名
        File newFile = new File(filePath, fileComName);
        if (!newFile.exists())
            newFile.mkdirs();
        else newFile.delete();
        inputFile.transferTo(newFile);
        return fileComName;
    }

    /**
     * 用于获取并校验文件后缀名
     *
     * @param file      传入文件
     * @param expectExt 校验后缀名集合
     * @return 返还获取后缀名
     * @throws CustomException 当无后缀名,后缀名不符合,无传入文件时时抛出该异常
     */
    public static String getExt(MultipartFile file, List<String> expectExt) throws CustomException {
        if (file == null)
            throw new CustomException(CustomExceptionType.NO_FILE_ERROR, "无对应文件上传");

        String fileOriginName = file.getOriginalFilename();//原文件名
        String ext;//文件后缀名
        if (fileOriginName.contains(".")) {
            //若文件存在后缀名
            ext = fileOriginName.substring(fileOriginName.indexOf("."));//获取文件后缀名

            if (expectExt.contains(ext))//为符合后缀名文件才正常返回
                return ext;
        }
        //不存在后缀名则文件不合法
        throw new CustomException(CustomExceptionType.FILE_FORM_ERROR, "上传视频非" + expectExt + "格式");
    }

    /**
     * 用于删除文件
     *
     * @param filePath 文件地址
     * @return 返还删除情况
     */
    public static boolean delete(String filePath) {
        if (StringUtils.isEmpty(filePath)) {
            return false;
        }
        File file = new File(basePath + (filePath.startsWith("/") ? filePath : ("/" + filePath)));
        return file.delete();
    }


    @Value("${path.basePath}")
    public void setBasePath(String basePath) {
        IO.basePath = basePath;
    }
}

